import re

# . 匹配任意1个字符(除了\n,\.)
# [] 匹配[]中列举的字符
# \d 匹配数字，即0-9
# \D 匹配非数字
# \s 匹配空白，即空格、tab键
# \S 匹配非空白
# \w 匹配单词字符 即 a-z、A-Z、0-9、_
# \W 匹配非单词字符

# 次数匹配
# * 匹配前一个规则的字符出现0至无数次
# + 匹配前一个规则的字符出现1至无数次
# ？ 匹配前一个规则的字符出现0次或1次
# {m} 匹配前一个规则的字符出现m次
# {m,} 匹配前一个规则的字符出现最少m次
# {m,n} 匹配前一个规则的字符出现m到n次

# 边界匹配
# ^ 匹配字符串开头
# $ 匹配字符串结尾
# \b 匹配一个单词的边界
# \B 匹配非单词边界

# 分组匹配
# | 匹配左右任意一个表达式
# () 将括号中字符作为一个分组

s = "@@python ！！！666####cast tiihasdhkjfjhjf cuijq dsadsa "
# 找出全部数字
result = re.findall(r'\d', s)  # 字符串前面r 表示字符串中转义字符无效，就是普通字符的意思
print(result)

# 找出特殊字符
result = re.findall(r'\W', s)  # 字符串前面r 表示字符串中转义字符无效，就是普通字符的意思
print(result)

# 字母数字
result = re.findall(r'[a-zA-Z0-9]', s)  # 字符串前面r 表示字符串中转义字符无效，就是普通字符的意思
print(result)

# 匹配账号，只能由字母和数字组成，长度限制6到10位
r = '^[0-9a-zA-Z]{6,10}$'
s = '1234567'
print(re.findall(r, s))

# 匹配QQ号，纯数字，长度5-11，第一位不为0
r = '^[1-9][0-9]{4,10}$'
s = '1234567'
print(re.findall(r, s))

# 匹配邮箱地址，只允许qq\163\gmail这三种邮箱
r6 = r'(^[\w-]+(\.[\w-]+)*@(qq|163|gmail)(\.[\w-]+)+$)'
s6 = 'a.b.c.d.e@qq.com.a.b'
print(re.match(r6, s6))
